<!DOCTYPE html>
<html>

<head>
  <title>Qute - Why (Not Just) Yet Another Templating Engine</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/blog/qute/" />
  <meta property="og:title" content="Qute - Why (Not Just) Yet Another Templating Engine" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/blog/qute/">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="post">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="active">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="post-page grid-wrapper">
  <div class="width-8-12 width-12-12-m doc-content">
    <div class="grid-wrapper">
      <div class="width-12-12">
        <p>
          <a href="/blog"><i class="fas fa-angle-left"></i> Back to all posts</a>
        </p>
      </div>
      <div class="width-12-12">
        <div class="post-date">
          February 23, 2020 
          
            <span class="tags"></span>
          
        </div>
        <h1 class="post-title">Qute - Why (Not Just) Yet Another Templating Engine</h1>
        <div class="grid-wrapper">
          <div class="width-8-12 width-12-12-m byline-wrapper">
            
            
              <img class="headshot" src="https://www.gravatar.com/avatar/8036ef0e54eaf768510dcc9be07762a6">
            
            <p class="byline">By Martin Kouba</p>
          </div>
          <div class="width-12-12">
              <div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Qute is an experimental feature.</p>
</div>
<div class="paragraph">
<p>There is no guarantee of stability nor long term presence in the platform until the solution matures.</p>
</div>
<div class="paragraph">
<p>An <a href="https://quarkus.io/guides/qute">introduction guide</a> and a more comprehensive <a href="https://quarkus.io/guides/qute-reference">reference guide</a> are available.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Let&#8217;s start with a very good question: <em>"Why yet another templating engine?"</em>.
There are plenty of templating libraries in Java.
And Quarkus is known to build on top of "Best of Breed Libraries and Standards".
That&#8217;s true.
On the other hand, the Quarkus community is also a powerful innovation catalyst.
And so we decided to start Qute (QUarkus TEmplates) - a templating engine designed specifically to meet the Quarkus needs.
We believe that we can bring new ideas even to such an explored area as the templating is.</p>
</div>
<div class="sect1">
<h2 id="basic-ideas"><a class="anchor" href="#basic-ideas"></a>Basic Ideas</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Our main goal is to provide an opinionated innovative templating engine.
But we don&#8217;t want to reinvent the wheel.
Instead, we got inspired by existing technologies.
Just a few examples:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The <a href="https://quarkus.io/guides/qute-reference#syntax-and-building-blocks">syntax</a> is mainly inspired by <a href="https://handlebarsjs.com/">Handlebars</a> and <a href="https://www.dustjs.com/">Dust.js</a>.</p>
</li>
<li>
<p>The <a href="https://quarkus.io/guides/qute-reference#include_helper">template inheritance</a> is inspired by <a href="https://en.wikipedia.org/wiki/Facelets">Facelets</a> and <a href="https://docs.djangoproject.com/en/3.0/ref/templates/language/">Django</a>.</p>
</li>
<li>
<p>Qute supports the <a href="https://en.wikipedia.org/wiki/Elvis_operator">elvis operator</a> you might be familiar with from <a href="https://groovy-lang.org/">Groovy</a> and <a href="https://kotlinlang.org/">Kotlin</a>.</p>
</li>
<li>
<p><a href="https://quarkus.io/guides/qute-reference#template_extension_methods">Extension methods</a>  that can be used to extend the data classes with new functionality are also inspired by modern languages.</p>
</li>
<li>
<p>If you come from the world of JSP/JSF/Facelets you&#8217;ll appreciate that <code>@Named</code> CDI beans can be referenced directly in any template through the <code>inject</code> namespace, e.g. <code>{inject:foo.price}</code>. See <a href="https://quarkus.io/guides/qute-reference#injecting-beans-directly-in-templates">Injecting Beans Directly In Templates</a> for more information.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>But that&#8217;s not all.
We introduce new features based on Quarkus principles&#8230;&#8203;</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="asynchronous-data-resolution-on-the-way-to-reactive"><a class="anchor" href="#asynchronous-data-resolution-on-the-way-to-reactive"></a>Asynchronous Data Resolution - On The Way To Reactive</h2>
<div class="sectionbody">
<div class="paragraph">
<p>When we started to design Qute we had one important aspect in mind - the data resolution API should be asynchronous.
This allows for better resource utilization and fits the Quarkus reactive model.
Another consequence of this design decision is that it&#8217;s possible to leverage non-blocking clients directly from a template, i.e. to asynchronously fetch data from various sources.</p>
</div>
<div class="listingblock">
<div class="title">Non-blocking Client Data Fetching Example</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="html" class="language-html hljs">{@org.acme.Client client} <i class="conum" data-value="1"></i><b>(1)</b>
&lt;html&gt;
&lt;body&gt;
    &lt;h1&gt;Quarkus Open Pull Requests&lt;/h1&gt;
    {#for pull in client.pullRequests} <i class="conum" data-value="2"></i><b>(2)</b>
        &lt;p&gt;{pull.title} - {pull.user.login}&lt;/p&gt;
    {/for}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Parameter declaration - maps <code>client</code> to <code>org.acme.Client</code>. See the <a href="#type-safe-templates">next section</a> for more information.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td><code>org.acme.Client#getPullRequests()</code> is using a non-blocking Vert.x client to fetch the data directly from the GitHub API. Since the data resolution is asynchronous the thread is not blocked and can continue performing some other tasks:
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">CompletionStage&lt;JsonArray&gt; getPullRequests() {
   return webClient
            .get(80, "api.github.com", "/repos/quarkusio/quarkus/pulls?state=open&amp;per_page=10")
            .as(BodyCodec.jsonArray())
            .send()
            .thenCompose(r -&gt; {
               if (r.statusCode() == 200) {
                  return CompletableFuture.completedFuture(r.body());
               } else {
                  // Log errors etc.
               }
            });
}</code></pre>
</div>
</div></td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="type-safe-templates"><a class="anchor" href="#type-safe-templates"></a>Type-safe Templates</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Most of the templating engines are not type-safe, ie. do not prevent type errors.
It&#8217;s quite natural because dynamicity in templates is very often practical.
On the other hand, a user is not protected from tedious errors caused by typos and various refactoring consequences.
Qute templates can be <em>optionally</em> type-safe.
What does it actually mean?
A template may contain one or more <strong>parameter declarations</strong>.
A parameter declaration binds a concrete type information to a given identifier in the current context.
And what are the advantages of having a type-safe template?</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Quarkus validates <em>all expressions</em> that reference a parameter declaration. If an invalid/incorrect expression is found the build fails.</p>
</li>
</ul>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
In development mode, all files located in the <code>src/main/resources/templates</code> directory are watched for changes and modifications are immediately visible. That also implies that your application fails fast whenever a type error occurs.
</td>
</tr>
</table>
</div>
<div class="ulist">
<ul>
<li>
<p>A <em>value resolver</em> is generated for all types used in parameter declarations so that it’s possible to access its properties without reflection. This is very useful when targeting GraalVM native images.</p>
</li>
<li>
<p>We have few more ideas in our TODO list, such as performance optimizations for type-safe expressions, etc.</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="title">Type-safe Template Example</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="html" class="language-html hljs">{@org.acme.Foo foo} <i class="conum" data-value="1"></i><b>(1)</b>
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;Qute Hello&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;{title}&lt;/h1&gt;  <i class="conum" data-value="2"></i><b>(2)</b>
  &lt;p&gt;{foo.message}&lt;/p&gt;  <i class="conum" data-value="3"></i><b>(3)</b>
  {#for foo in baz.foos}
    &lt;p&gt;Hello {foo.message}!&lt;/p&gt;  <i class="conum" data-value="4"></i><b>(4)</b>
  {/for}
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Parameter declaration - maps <code>foo</code> to <code>org.acme.Foo</code>.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td><code>{title}</code> is not validated - not matching a param declaration.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td><code>{foo.message}</code> is validated. <code>org.acme.Foo</code> must have a property <code>message</code> or a matching template extension method must exist.</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td><code>{foo.message}</code> is not validated because <code>foo</code> is overridden in the loop section and there is no type information available.</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Only properties are currently validated in expressions; "virtual methods" such as <code>foo.getBar(baz.name)</code> are currently ignored.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="first-class-quarkus-citizen"><a class="anchor" href="#first-class-quarkus-citizen"></a>First-class Quarkus Citizen</h2>
<div class="sectionbody">
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
Despite the fact that Qute is highly optimized for Quarkus the core engine is developed as an independent library that could be integrated in any environment.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>In Quarkus, all templates located in the <code>src/main/resources/templates</code> directory are validated and can be easily injected.</p>
</div>
<div class="listingblock">
<div class="title">Template Injection Example</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.qute;

import io.quarkus.qute.Template;

class MyBean {

    @Inject
    Template items; <i class="conum" data-value="1"></i><b>(1)</b>

    @Inject
    Service service;

    String renderItems() {
       return items.data("items", service.getItems()).render(); <i class="conum" data-value="2"></i><b>(2)</b>
    }
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>The field name is used to locate the template. In this particular case, the container will attempt to locate a template with path <code>src/main/resources/templates/items.html</code>. If there is no such template available the build fails.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>See the <a href="https://quarkus.io/guides/qute-reference#hello-world-example">Hello World Example</a> to explore the basic workflow.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Moreover, a preconfigured <code>Engine</code> instance is provided and available for injection.
The <code>Engine</code> is a central point for template management and provides some low-level API.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="resteasy-integration"><a class="anchor" href="#resteasy-integration"></a>RESTEasy Integration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If used together with RESTEasy a resource method may return a <code>TemplateInstance</code> and the integration code takes care of all the necessary steps and renders the output to the response.
See <a href="https://quarkus.io/guides/qute-reference#resteasy-integration">RESTEasy Integration</a> for more information.</p>
</div>
<div class="listingblock">
<div class="title">JAX-RS Resource Example</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.qute;
...
import io.quarkus.qute.TemplateInstance;
import io.quarkus.qute.Template;

@Path("hello")
public class HelloResource {

    @Inject
    Template hello; <i class="conum" data-value="1"></i><b>(1)</b>

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public TemplateInstance get(@QueryParam("name") String name) {
        // the template looks like: Hello {name}!
        return hello.data("name", name); <i class="conum" data-value="2"></i><b>(2)</b> <i class="conum" data-value="3"></i><b>(3)</b>
    }
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>The field name is used to locate the template. In this particular case, we&#8217;re injecting a template with path <code>templates/hello.txt</code>.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td><code>Template.data()</code> returns a new template instance that can be customized before the actual rendering is triggered. In this case, we put the name value under the key <code>name</code>. The data map is accessible during rendering.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Note that we don&#8217;t trigger the rendering - this is done automatically by a special <code>ContainerResponseFilter</code> implementation.</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="mailer-integration"><a class="anchor" href="#mailer-integration"></a>Mailer Integration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Templates may come in handy when creating e-mail messages.
The Mailer extension integrates with Qute to provide a convenient way of sending e-mails.
In particular, the message body is automatically created using <code>*.html</code> and <code>*.txt</code> templates from the <code>src/main/resources/templates</code> directory.
See the <a href="https://quarkus.io/guides/mailer#message-body-based-on-qute-templates">Sending Emails</a> guide for more details.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="conclusion"><a class="anchor" href="#conclusion"></a>Conclusion</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Qute first landed in Quarkus 1.1.0.Final.
Since then we fixed many bugs and implemented some feature requests.
Feel free to join our community to stabilize the API, harden the implementation and explore the new possibilities!</p>
</div>
</div>
</div>
              
          </div>
          <div class="width-12-12"><div class="share-page">
  <a class="share-linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=https://quarkus.io/blog/qute/&title=Qute - Why (Not Just) Yet Another Templating Engine" rel="nofollow" target="_blank" title="Share on LinkedIn">
    <img src="/assets/images/share-page/icons_social-linkedin.png"/>
  </a>
  <a class="share-twitter" href="https://twitter.com/intent/tweet?text=Qute - Why (Not Just) Yet Another Templating Engine&url=https://quarkus.io/blog/qute/&via=quarkusio&related=quarkusio" rel="nofollow" target="_blank" title="Share on Twitter">
    <img src="/assets/images/share-page/icons_social-twitter.png"/>
  </a>
  <a class="share-facebook" href="https://facebook.com/sharer.php?u=https://quarkus.io/blog/qute/" rel="nofollow" target="_blank" title="Share on Facebook">
    <img src="/assets/images/share-page/icons_social-facebook.png"/>
  </a>
  <a class="share-reddit" href="http://www.reddit.com/submit?url=https://quarkus.io/blog/qute/" onclick="window.open(this.href, 'pop-up', 'left=20,top=20,width=900,height=500,toolbar=1,resizable=0'); return false;" title="Share on Reddit" >
    <img src="/assets/images/share-page/icons_social-reddit.png"/>
  </a>
  <a class="share-email" href="mailto:?subject=Qute - Why (Not Just) Yet Another Templating Engine&amp;body=Qute - Why (Not Just) Yet Another Templating Engine https://quarkus.io/blog/qute/" title="Share via Email" >
    <img src="/assets/images/share-page/icons_social-email.png"/>
  </a>
</div>
</div>
        </div>
      </div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
